package com.markerhub.common;

/**
 * @Desc
 * @Author madengling
 * @Time 2021/1/14 20:27
 */
public class BIji {

/*
nodejs安装后校验版本
E:\Program\nodejs>node -v
v14.15.4

E:\Program\nodejs>npm -v
6.14.10

# 安装淘宝npm
npm install -g cnpm --registry=https://registry.npm.taobao.org
# vue-cli 安装依赖包
cnpm install --g vue-cli
 */



/*
1.shiro简介
Authentication :身份认证/登录，验证用户是不是拥有相应的身份;
Authorization:授权，即权限验证，验证某个已认证的用户是否拥有某个权限;即判断用户是否能进行什么操作，如∶验证某个用户是否拥有某个角色。或老细粒度的验证某个用户对菜个资源是否具有某个权限;
Session Manager:会话管理，即用户登录后就是一次会话，在没有退出之前，它的所有信息都在会话中;会话可以是曾普通JavaSE环境，也可以是 Web环境的;
Cryptography :加密，保护数据的安全性，如密码加密存储到数据库，而不是明文存储;Web Support : Web支持，可以非常容易的集成到Web环境;
Caching:缓存，比如用户登录后，其用户信息、拥有的角色/权限不必每次去查，这样可以提高效率;
Concurrency : Shiro支持多线程应用的并发验证，即如在一个线程中开启另一个线程，能把权限自动传播过去;
Testing:提供测试支持;
Run As :允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;
Remember Me :记住我，这个是非常常见的功能，即一次登录后，下次再来的话不用登录了

Shiro架构
Subject :应用代码直接交互的对象是Subject，也就是说Shiro 的对外API核心就是Subject。Subject代表了当前“用户”，这个用户不一定是一个具体的人，与当前应用交互的任何东西都是Subject，如网络爬虫，机器人等;与subject的所有交互都会委托给SecurityManager ;
Subject其实是一个门面，SecurityManager才是实际的执行者;SecurityManager :安全管理器;即所有与安全有关的操作都会与
SecurityManager交互;且其管理着所有Subject;可以看出它是 Shiro.的核心，它负责与Shiro的其他组件进行交互，它相当于SpringMVC中DispatcherServlet的角色
Realm : Shiro 从 Realm获取安全数据（如用户、角色、权限），就是说SecurityManager要验证用户身份，那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把 Realm看成 DataSource

Subject :任何可以与应用交互的“用户”;
SecurityManager :相当于SprinaMVC中的 DispatcherServlet ;是Shiro的心脏;所有具体的交互都通过SecurityManager进行控制;它管理着所有Subject、且负责进行认证、授权、会话及缓存的管理。
Authenticator :负责Subject认证，是一个扩展点，可以自定义实现;可以使用认证策略(Authentication Strategy )，即什么情况下算用户认证通过了;
Authorizer:授权器、即访问控制器，用来决定主体是否有权限进行相应的操作;即控制着用户能访问应用中的哪些功能;
Realm :可以有1个或多个Realm，可以认为是安全实体数据源，即用于获取安全实体的;可以是JDBC 实现，也可以是内存实现等等;由用户提供;所以一般在应用中都需要实现自己的 Realm ;
SessionManager:管理Session生命周期的组件;而Shiro 并不仅仅可以用在 Web环境，也可以用在如普通的JavaSE环境
CacheManager:缓存控制器，来管理如用户、角色、权限等的缓存的;因为这些数据基本上很少改变，放到缓存中后可以提高访问的性能
Cryptography:密码模块，Shiro提高了一些常见的加密组件用于如密码加密/解密。

3.集成Spring
与web集成
Shiro提供了与Web集成的支持，其通过一个ShiroFilter入口来拦截需要安全控制的URL，然后进行相应的控制
ShiroFilter类似于如Strut2/SpringMVC这种web框架的前端控制器，是安全控制的入口点，其负责读取配置（如ini配置文件），然后判断URL是否需要登录/权限等工作。

配置的部分细节filterChainDefinitions
[urls]部分的配置，其格式是:“url=拦截器[参数]，拦截器[参数]”;
如果当前请求的url匹配[urls]部分的某个url模式，将会执行其配置的拦截器。
anon ( anonymous )拦截器表示匿名访问（即不需要登录即可访问)
authc ( authentication )拦截器表示需要身份认证通过后才能访问
logout 登出

URL匹配模式
url模式使用Ant风格模式
Ant路径通配符支持?、*、**，注意通配符匹配不包括目录分隔符"/":


*/
//1.?:匹配一个字符，如/admin?将匹配/admin1，但不匹配/admin或/admin/ ;
//2.* :匹配零个或多个字符串，如/admin将匹配/admin./admin123，但不匹配/admin/1 ;
//3.**:匹配路径中的零个或多个路径，如/admin/**将匹配/admin/a或/admin/a/b


/*
URL匹配顺序
URL权限采取第一次匹配优先的方式，即从头开始使用第一个匹配的 url模式对应的拦截器链。
如：
①/bb/**=filter1 ②/bb/aa=filter2 ③/**=filter3
④如果请求的url是"/bb/aa"，因为按照声明顺序进行匹配，那么将使用filter1进行拦截。
 */
/*
7.认证
①．获取当前的Subject．调用Securityutils.getsubject();
②．测试当前的用户是否已经被认证．即是否已经登录．调用subject 的isauthenticated()
③．若没有被认证，则把用户名和密码封装为UsernamePasswordToken对象
1).创建一个表单页面
2)．把请求提交到SpringMvC的Handler3)。获取用户名和密码.
④．执行登录:调用Subject 的login (AuthenticationToken)方法.
⑤．自定义Realm的方法，从数据库中获驭对应的记录，返回给 Shiro.
1)．实际上需要继承 org.apache.shiro.realm.AuthenticatingRealm 类
2)．实现doGetauthenticationInfo(AuthenticationToken)方法.
⑥.由shiro完成对密码的比对.

密码的比对：
通过AuthorizingRealm的父类AuthenticatingRealm的credentialsMatcher属性来进行的密码的比对

①.为什么使用MD5盐值加密∶
②.如何做到:
1)．在doGetAuthenticationInfo方法返回值创建SimpleRuthenticationinfo对象的时候,
需要使用
simpleAuthenticationInfo(principal，credentials，credentialssalt,realmName）构造器2)．使用Bytesource.Util.bytes()来计算盐值.
3)．盐值需要唯一:一般使用随机字符串或user id
4)．使用new simpleHash (hashalgorithmName，credentials， salt, hashIterations);来计算盐值加密后的密码的值.

AuthenticationStrategy
AuthenticationStrategy 接口的默认实现:
FirstSuccessfulStrategy:只要有一个Realm验证成功即可，只返回第一个Realm身份验证成功的认证信息，其他的忽略;
AtLeastOneSuccessfulStrategy:只要有一个Realm验证成功即可，和FirstSuccessfulStrategy不同，将返回所有Realm身份验证成功的认证信息;
AllSuccessfulStrategy:所有Realm验证成功才算成功，且返回所有Realm身份验证成功的认证信息，如果有一个失败就失败了。
ModularRealmAuthenticator默认是 AtLeastOneSuccessfulStrategy策略

授权
授权，也叫访问控制，即在应用中控制谁访问哪些资源(如访问页面/编辑数据/页面操作等)。在授权中需了解的几个关键对象︰主体( Subject )、资源(Resource )、权限(Permission)、角色(Role ).
主体(Subject):访问应用的用户，在 Shiro中使用Subject代表该用户。用户只有授权后才允许访问相应的资源。
资源(Resource):在应用中用户可以访问的URL，比如访问JSP页面、查看/编辑某些数据、访问某个业务方法、打印文本等等都是资源。用户只要授权后才能访问,
权限(Permission):安全策略中的原子授权单位，通过权限我们可以表示在应用中用户有没有操作某个资源的权力。即权限表示在应用中用户能不能访问某个资源，如:访问用户列表页面查看/新增/修改/删除用户数据（即很多时候都是CRUD(增查改删）式权限控制)等。权限代表了用户有没有操作某个资源的权利，即反映在某个资源上的操作允不允许。
Shiro支持粗粒度权限（如用户模块的所有权限）和细粒度权限(操作某个用户的权限，即实例级别的)
角色(Role):权限的集合，一般情况下会赋予用户角色而不是权限，即这样用户可以拥有一组权限，赋予权限时比较方便。典型的如∶项目经理、技术总监、CTO、开发工程师等都是角色，不同的角色拥有一组不同的权限。

Shiro支持三种方式的授权︰
- 编程式:通过写if/else授权代码块完成
- 注解式:通过在执行的Java方法上放置相应的注解完成，没有权限将抛出相应的异常
- JSP/GSP标签:在JSP/GSP页面通过相应的标签完成

if(subject.hasRole("admin")){
    //有权限
} else {
    //无权限
}

@RequiresRoles("admin")
public void hello(){
    //有权限
}

<shiro:hasRole name="admin">
<!-- 有权限 -->
</shiro:hasRole>

默认拦截器
Shiro内置了很多默认的拦截器，比如身份验证、授权等相关的。默认拦截器可以参考org.apache.shiro.web.filter.mgt.DefaultFilter中的枚举拦截器:
public enum DefaultFilter {

    anon(AnonymousFilter.class),//匿名拦截器，即不需要登录即可访问；一般用于静态资源过滤
    authc(FormAuthenticationFilter.class),//基于表单的拦截器，如果没有登录会跳转到相应的登录页面登录
    authcBasic(BasicHttpAuthenticationFilter.class),//BasicHTTP身份验证拦截器
    logout(LogoutFilter.class),//退出拦截器
    noSessionCreation(NoSessionCreationFilter.class),
    perms(PermissionsAuthorizationFilter.class),//权限授权拦截器，验证用户是否拥有所有权
    port(PortFilter.class),//端口拦截器，主要属性:port(80)，如果用户访问该页面时非80，将自动将请求端口改为80并重定向到该80端口，其他路径、参数等都一样
    rest(HttpMethodPermissionFilter.class),//rest风格拦截器，自动根据请求方法构建权限字符串，会自动拼出权限字符串进行权限匹配
    roles(RolesAuthorizationFilter.class),//角色授权拦截器，验证用户是否拥有所有角色
    ssl(SslFilter.class),//SSL拦截器，只有请求协议是https才能通过；否则自动跳转https端口
    user(UserFilter.class);//用户拦截器，用户已经身份验证/记住我登录的都可
3:17



 */



}
